// Package car_park_api
// @Author Spume
// @Date 2024-12-19

package car_park_api

import "time"

// CommonResponse 通用响应结构
type CommonResponse[T any] struct {
	Msg    string `json:"msg"`
	Status int    `json:"status"`
	Data   T      `json:"data"`
}

// ============ 停车场相关模型 ============

// ParkSimple 停车场简单信息
type ParkSimple struct {
	ParkCode int64  `json:"parkCode"` // 停车场编码
	ParkName string `json:"parkName"` // 停车场名称
}

// GetParksInput 获取停车场列表输入参数
type GetParksInput struct {
	AK          string `json:"ak" validate:"required"`         // 访问密钥
	SK          string `json:"sk" validate:"required"`         // 秘密密钥
	Page        int    `json:"page" validate:"min=1"`          // 页码
	Limit       int    `json:"limit" validate:"min=1,max=100"` // 每页数量
	CompanyCode string `json:"companyCode"`                    // 公司编码
	Debug       bool   `json:"debug"`                          // 调试模式
}

// GetParksResponse 获取停车场列表响应
type GetParksResponse struct {
	Count int           `json:"count"`
	Data  []*ParkSimple `json:"data"`
}

// ============ 月卡相关模型 ============

// MonthCar 月卡信息
type MonthCar struct {
	OwnerName         string `json:"ownerName"`         // 车主姓名
	Mobile            string `json:"mobile"`            // 手机号
	CarNumber         string `json:"carNumber"`         // 车牌号
	SpaceParkingCount int    `json:"spaceParkingCount"` // 停车位数量
	GrantCode         int64  `json:"grantCode"`         // 授权码
	StartTime         int    `json:"startTime"`         // 开始时间
	EndTime           int    `json:"endTime"`           // 结束时间
	Amount            int    `json:"amount"`            // 金额（分）
	BaseTypeCode      int    `json:"baseTypeCode"`      // 基础类型编码
	BaseTypeName      string `json:"baseTypeName"`      // 基础类型名称
	CardTypeName      string `json:"cardTypeName"`      // 卡类型名称
	Addr              string `json:"addr"`              // 地址
}

// GetMonthCarsInput 获取月卡列表输入参数
type GetMonthCarsInput struct {
	AK        string   `json:"ak" validate:"required"`            // 访问密钥
	SK        string   `json:"sk" validate:"required"`            // 秘密密钥
	ParkCodes []string `json:"parkCodes"`                         // 停车场编码列表
	CarNumber string   `json:"carNumber"`                         // 车牌号
	PageIndex int      `json:"pageIndex" validate:"min=1"`        // 页码
	PageSize  int      `json:"pageSize" validate:"min=1,max=100"` // 每页数量
	Debug     bool     `json:"debug"`                             // 调试模式
}

// GetMonthCarsResponse 获取月卡列表响应
type GetMonthCarsResponse struct {
	Total   int        `json:"total"`   // 总数
	Details []MonthCar `json:"details"` // 详情列表
}

// ============ 订单相关模型 ============

// ParkBusiness 停车场业务订单
type ParkBusiness struct {
	OrderCode         int64  `json:"orderCode"`         // 订单编码
	ParkCode          int    `json:"parkCode"`          // 停车场编码
	OrderType         int    `json:"orderType"`         // 订单类型
	CarNumber         string `json:"carNumber"`         // 车牌号
	PayWay            int    `json:"payWay"`            // 支付方式
	Amount            int64  `json:"amount"`            // 金额（分）
	OrderTime         int    `json:"orderTime"`         // 订单时间
	InDate            int    `json:"inDate"`            // 入场时间
	OutDate           int    `json:"outDate"`           // 出场时间
	DiscountAmount    int64  `json:"discountAmount"`    // 优惠金额（分）
	FreeAmount        int64  `json:"freeAmount"`        // 免费金额（分）
	OutStandingAmount int64  `json:"outStandingAmount"` // 未付金额（分）
	OnLineOrderCode   string `json:"onLineOrderCode"`   // 线上订单编码
}

// GetOrdersInput 获取订单列表输入参数
type GetOrdersInput struct {
	AK        string `json:"ak" validate:"required"` // 访问密钥
	SK        string `json:"sk" validate:"required"` // 秘密密钥
	ParkCode  string `json:"parkCode"`               // 停车场编码
	StartTime int64  `json:"startTime"`              // 开始时间
	EndTime   int64  `json:"endTime"`                // 结束时间
	Debug     bool   `json:"debug"`                  // 调试模式
}

// AbnormalOrder 异常订单
type AbnormalOrder struct {
	RecordCode    int64  `json:"recordCode"`    // 记录编码
	ParkCode      int64  `json:"parkCode"`      // 停车场编码
	ParkName      string `json:"parkName"`      // 停车场名称
	InOutCode     int64  `json:"inOutCode"`     // 进出编码
	CarNumber     string `json:"carNumber"`     // 车牌号
	InTime        string `json:"inTime"`        // 入场时间
	OutTime       string `json:"outTime"`       // 出场时间
	Amount        int    `json:"amount"`        // 金额（分）
	PayTime       string `json:"payTime"`       // 支付时间
	PayDetailCode int64  `json:"payDetailCode"` // 支付详情编码
	SerialNumber  string `json:"serialNumber"`  // 序列号
}

// GetAbnormalOrdersInput 获取异常订单输入参数
type GetAbnormalOrdersInput struct {
	AK     string   `json:"ak" validate:"required"` // 访问密钥
	SK     string   `json:"sk" validate:"required"` // 秘密密钥
	Orders []string `json:"orders"`                 // 订单号列表
	Debug  bool     `json:"debug"`                  // 调试模式
}

// ============ 辅助方法 ============

// IsValid 检查GetParksInput是否有效
func (g *GetParksInput) IsValid() error {
	if g.AK == "" {
		return NewInvalidParamsError("AK不能为空")
	}
	if g.SK == "" {
		return NewInvalidParamsError("SK不能为空")
	}
	if g.Page <= 0 {
		g.Page = DefaultPageIndex
	}
	if g.Limit <= 0 {
		g.Limit = DefaultPageSize
	}
	if g.Limit > MaxPageSize {
		g.Limit = MaxPageSize
	}
	return nil
}

// IsValid 检查GetMonthCarsInput是否有效
func (g *GetMonthCarsInput) IsValid() error {
	if g.AK == "" {
		return NewInvalidParamsError("AK不能为空")
	}
	if g.SK == "" {
		return NewInvalidParamsError("SK不能为空")
	}
	if g.PageIndex <= 0 {
		g.PageIndex = DefaultPageIndex
	}
	if g.PageSize <= 0 {
		g.PageSize = DefaultPageSize
	}
	if g.PageSize > MaxPageSize {
		g.PageSize = MaxPageSize
	}
	return nil
}

// IsValid 检查GetOrdersInput是否有效
func (g *GetOrdersInput) IsValid() error {
	if g.AK == "" {
		return NewInvalidParamsError("AK不能为空")
	}
	if g.SK == "" {
		return NewInvalidParamsError("SK不能为空")
	}
	if g.ParkCode == "" {
		return NewInvalidParamsError("停车场编码不能为空")
	}
	if g.StartTime <= 0 || g.EndTime <= 0 {
		return NewInvalidParamsError("时间范围无效")
	}
	if g.StartTime >= g.EndTime {
		return NewInvalidParamsError("开始时间必须小于结束时间")
	}
	return nil
}

// IsValid 检查GetAbnormalOrdersInput是否有效
func (g *GetAbnormalOrdersInput) IsValid() error {
	if g.AK == "" {
		return NewInvalidParamsError("AK不能为空")
	}
	if g.SK == "" {
		return NewInvalidParamsError("SK不能为空")
	}
	if len(g.Orders) == 0 {
		return NewInvalidParamsError("订单号列表不能为空")
	}
	return nil
}

// FormatTime 格式化时间戳为字符串
func FormatTime(timestamp int64) string {
	if timestamp <= 0 {
		return ""
	}
	return time.Unix(timestamp, 0).Format("2006-01-02 15:04:05")
}

// ParseTime 解析时间字符串为时间戳
func ParseTime(timeStr string) (int64, error) {
	if timeStr == "" {
		return 0, nil
	}
	t, err := time.Parse("2006-01-02 15:04:05", timeStr)
	if err != nil {
		return 0, err
	}
	return t.Unix(), nil
}
